#include "sem.h"

void init_sem(int semid, int sem_num, int val)
{
    if (semctl(semid, sem_num, SETVAL, val) < 0)
    {
        perror("sem set val error!");
        exit(1);
    }
}

int creat_sem(int nsems)
{
    int sid;
    key_t key;
    key = ftok(SEM_NAME, 'k');

    sid = semget(key, nsems, 0655 | IPC_CREAT | IPC_EXCL);

    if (sid < 0)
    {
        if (errno == EEXIST)
        {
            sid = semget(key, nsems, 0);
        }
        else
        {
            perror("sem get error!");
            exit(1);
        }
    }

    return sid;
}

void delete_sem(int semid, int semnum)
{
    if (semctl(semid, 0, IPC_RMID) < 0)
    {
        perror("delete sem error!");
        exit(1);
    }

    printf("delete sem!\n");
}

void p_sem(int semid, int semnum)
{
    struct sembuf my_sembuf[1];

    my_sembuf[0].sem_num = semnum;
    my_sembuf[0].sem_op = -1;
    my_sembuf[0].sem_flg = SEM_UNDO;

    if (semop(semid, my_sembuf, 1) < 0)
    {
        perror("sem op p error!\n");
        exit(1);
    }
}

void v_sem(int semid, int semnum)
{
    struct sembuf my_sembuf[1];

    my_sembuf[0].sem_num = semnum;
    my_sembuf[0].sem_op = 1;
    my_sembuf[0].sem_flg = SEM_UNDO;

    if (semop(semid, my_sembuf, 1) < 0)
    {
        perror("sem op v error!\n");
        exit(1);
    }
}